package org.robot.utils;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.helper.StringUtil;
import org.jsoup.nodes.Document;
import org.robot.component.Page;

/**
 * 关于正则的工具类
 */
public class RegexUtil {
	
	/**
	 * 返回第一个满足正则表达式的字符串
	 * @param regex 正则，正则为null，返回input
	 * @param input 输入字符串
	 * @return 返回满足正则表达式的字符串集合
	 */
	public static String regexFirst(String regex, String input){
		if (regex == null)
			return input;
		List<String> list = regex(regex, input);
		if (list == null || list.isEmpty())
			return null;
		return list.get(0);
	}
	
	/**
	 * 返回满足正则表达式的字符串集合
	 * @param regex 正则
	 * @param input 输入字符串
	 * @return 返回满足正则表达式的字符串集合
	 */
	public static List<String> regex(String regex, String input){
		List<String> list = new ArrayList<String>();
		if (!StringUtil.isBlank(regex)) {
			Pattern p = Pattern.compile(regex);
			Matcher m = p.matcher(input);
			while(m.find()){
				list.add(m.group());
			}
		} else
			list.add(input);
		return list;
	}
	
	/**
	 * 返回满足正则表达式的字符串集合
	 * @param regex 正则
	 * @param inputList 输入字符串集合
	 * @return 返回满足正则表达式的字符串集合
	 */
	public static List<String> regex(List<String> inputList, String regex){
		List<String> regexList = new ArrayList<String>();
		regexList.add(regex);
		return regex(inputList, regexList);
	}
	
	/**
	 * 只要满足正则集合中任意一个正则，就提取出字符串并保存到集合中，最后将集合返回
	 * @param regexList 正则集合
	 * @param inputList 输入字符串集合
	 * @return 返回满足正则表达式的字符串集合
	 */
	public static List<String> regex(List<String> inputList, List<String> regexList){
		List<String> list = new ArrayList<String>();
		for (String input : inputList) {
			for(String regex : regexList){
				Pattern p = Pattern.compile(regex);
				Matcher m = p.matcher(input);
				while(m.find()){
					list.add(m.group());
				}
			}
		}
		return list;
	}

	/**
	 * 返回满足正则的字符串的集合
	 * @param regex 正则
	 * @param pageList 
	 * @return 返回满足正则的字符串的集合
	 */
	public static List<String> pageRegex(String regex, List<Page> pageList) {
		List<String> list = new ArrayList<String>();
		for (Page page : pageList) {
			list.addAll(regex(regex, page.html()));
		}
		return list;
	}
	
	/**
	 * 返回满足正则的字符串的集合, 可能会有重复的，看是否需要调用去重的方法
	 * @param regex 正则
	 * @param pageList 
	 * @return 返回满足正则的字符串的集合
	 */
	public static List<String> pageRegex(List<String> regexList, List<Page> pageList) {
		List<String> list = new ArrayList<String>();
		for(String regex : regexList){
			list.addAll(pageRegex(regex, pageList));
		}
		return list;
	}
	
	/**
	 * 针对字符串集合去重
	 * @param list
	 */
	public static List<String> removeRepetition(List<String> list){
		List<String> newList = new ArrayList<String>();
		HashSet<String> set = new HashSet<String>();
		set.addAll(list);
		newList.addAll(set);
		return newList;
	}
	
	/**
	 * 将满足某正则的字符串中的字串给替换掉，如将13,4,ab,cd,ef中字母之间的逗号替换为;就可以这样replaceSpecified("13,4,ab,cd,ef", "[a-z],[a-z]", ",", ";")
	 * 写正则要注意，按正则查找，下一次查找的起始位置是从本次查找到的字符串的最后一个字符的下一位开始找的
	 * @param src
	 * @param regex
	 * @param specified
	 * @param replacement
	 * @return
	 */
	public static String replaceSpecified(String src, String regex, String specified, String replacement) {
		List<String> regexStrList = regex(regex, src);
		for (String regexStr : regexStrList) {
			String newReplacement = regexStr.replace(specified, replacement);
			src = src.replace(regexStr, newReplacement);
		}
		return src;
	}
	
	/**
	 * 把满足regex1的所有字符串中满足regex2的字串替换成replacement
	 * @param src
	 * @param regex1
	 * @param regex2
	 * @param replacement
	 * @return
	 */
	public static String replaceRegexRegex(String src, String regex1, String regex2, String replacement) {
		List<String> regexStrList = regex(regex1, src);
		for (String regexStr : regexStrList) {
			String newReplacement = regexStr.replaceAll(regex2, replacement);
			src = src.replace(regexStr, newReplacement);
		}
		return src;
	}
	
	public static String getIssn(String input) {
		return regexFirst("[A-Z0-9]{4}-[A-Z0-9]{4}", input);
	}
	
	public static boolean isIssn(String issn) {
		return issn.matches("[A-Z0-9]{4}-[A-Z0-9]{4}");
	}
	
	public static String getIssnonline(String input) {
		return regexFirst("[A-Z0-9]{4}-[A-Z0-9]{4}", input);
	}
	
	public static boolean isIssnonline(String issnonline) {
		return issnonline.matches("[A-Z0-9]{4}-[A-Z0-9]{4}");
	}
	
	public static String getYear(String input) {
		return regexFirst("\\d{4}", input);
	}
	public static boolean isYear(String year) {
		if (year.matches("\\d{4}")) {
			int y = Integer.parseInt(year);
			return y > 1930 && y <= LocalDate.now().getYear();
		}
		return false;
	}
	
	
	
	public static void main(String[] args) throws IOException {
//		System.out.println(replaceSpecified("Hao BAI<sup>1</sup>(<a href=<img srcrder=\"kjfksdj\"</a>), Kunsheng WANG<sup>2</sup>, Changzhen HU<sup>1</sup>, Gang ZHANG<sup>2</sup>, Xiaochuan JING<sup>2</sup>", ",\\s*[a-zA-Z]", ",", ";"));
		Document doc = Jsoup.parse(new File("E:/webSpider/IndianJournals/3/0000AA/4601E94A01AB7E6E9B56770C528F6CD3.html"), null);
		String input = doc.select("a.navlink:contains(Archive)").outerHtml();
		System.out.println(input);
		String regexFirst = regexFirst("href=['\"].{2,}?['\"]", input);
		System.out.println(regexFirst);
	}

}
